/*
 * Invocateur.cpp
 *  Created on: 19 nov. 2012
 *      Author: aboursie - potier
 */

#include <stdlib.h>
#include "Invocateur.h"

void Invocateur::help() {
	cout << "Aide : " << endl;
	cout << "Commandes possibles : " << endl;
	cout << "'AVANCER int int' pour avancer le robot" << endl;
	cout << "'EVALUEROBS' pour evaluer la hauteur d'un obstacle" << endl;
	cout << "'FIGER' pour figer le robot" << endl;
	cout << "'PESER' pour peser un objet" << endl;
	cout << "'POSER' pour poser un objet" << endl;
	cout
			<< "'RENCONTREROBS int' pour rencontrer un obstacle de hauteur passee en parametre"
			<< endl;
	cout << "'REPARTIR' pour faire repartir le robot" << endl;
	cout << "'SAISIR int' pour saisir un objet de poids passe en parametre"
			<< endl;
	cout
			<< "'TOURNER string' pour tourner le robot dans la direction passee en parametre"
			<< endl;
	cout << "'UNDO' pour desexecuter la derniere action effectuee" << endl;
	cout << "'HELP' pour afficher l'aide" << endl;
	cout << "'EXIT' pour quitter" << endl;
}

void Invocateur::read() {
	string str;
	vector<string> arguments;
	Commande * c;

	help();

	while (getline(cin, str)) {
		arguments.clear();
		size_t car = str.find_first_not_of(" ", 0);
		size_t pos = str.find_first_of(" ", car);
		while (string::npos != pos || string::npos != car) {
			arguments.push_back(str.substr(car, pos - car));
			car = str.find_first_not_of(" ", pos);
			pos = str.find_first_of(" ", car);
		}

		if (arguments.size() >= 1) {
			string commande = arguments[0];
			if (commande == "HELP") {
				help();
			} else if (commande == "EXIT" || commande == "exit") {
				exit(0);
			} else if ((commande == "UNDO") && (Commande::pile.size() > 0)) {
				Commande::pile.top()->desexecute();
			} else if ((commande == "UNDO") && (Commande::pile.size() == 0)) {
				cout << "Aucune action a annuler." << endl;
			} else {
				if (Commande::commandes[commande] != NULL) {
					c = Commande::commandes[commande]->constructeurVirtuel();
					arguments.erase(arguments.begin());
					if (c->initialiserArguments(arguments)) {
						c->execute();
					} else {
						cout << "Erreur d'arguments" << endl;
					}
				} else {
					cout << "Commande inconnue" << endl;
				}
			}
		}
	}
}

